home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_11_03 / 1103020a < prev    next >
Text File  |  1993-01-04  |  1KB  |  57 lines

  1. /* _Strftime function */
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "xtime.h"
  5.  
  6.         /* macros */
  7. #define PUT(s, na)    (void)(nput = (na), \
  8.     0 < nput && (nchar += nput) <= bufsize ? \
  9.         (memcpy(buf, s, nput), buf += nput) : 0)
  10.  
  11. size_t _Strftime(char *buf, size_t bufsize, const char *fmt,
  12.     const struct tm *t, _Tinfo *tin)
  13.     {    /* format time information */
  14.     const char *fmtsav, *s;
  15.     size_t len, lensav, nput;
  16.     size_t nchar = 0;
  17.  
  18.     for (s = fmt, len = strlen(fmt), fmtsav = NULL;
  19.         ; fmt = s)
  20.         {    /* parse format string */
  21.         int n;
  22.         wchar_t wc;
  23.         _Mbsave state = {0};
  24.  
  25.         while (0 < (n = _Mbtowc(&wc, s, len, &state)))
  26.             {    /* scan for '%' or '\0' */
  27.             s += n, len -= n;
  28.             if (wc == '%')
  29.                 break;
  30.             }
  31.         if (fmt < s)    /* copy any literal text */
  32.             PUT(fmt, s - fmt - (0 < n ? 1 : 0));
  33.         if (0 < n)
  34.             {    /* do the conversion */
  35.             char ac[20];
  36.             int m;
  37.             const char *p = _Gentime(t, tin, s++,
  38.                 &m, ac);
  39.  
  40.             --len;
  41.             if (0 <= m)
  42.                 PUT(p, m);
  43.             else if (fmtsav == NULL)
  44.                 fmtsav = s, s = p, lensav = len,
  45.                     len = -m;
  46.             }
  47.         if (0 == len && fmtsav == NULL || n < 0)
  48.             {    /* format end or bad multibyte char */
  49.             PUT("", 1);    /* null termination */
  50.             return (nchar <= bufsize ? nchar - 1 : 0);
  51.             }
  52.         else if (0 == len)
  53.             s = fmtsav, fmtsav = NULL, len = lensav;
  54.         }
  55.     }
  56.  
  57.